package com.wjp.controller;


import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.http.converter.json.MappingJacksonValue;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

import com.fasterxml.jackson.databind.util.JSONPObject;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.wjp.bean.Employee;
import com.wjp.service.EmployeeService;
import com.wjp.utils.Msg;
import com.wjp.utils.Utils;
/**
 * 处理员工CRUD请求
 * @author Administrator
 *
 */
@Controller
public class EmployeeController {
	@Autowired
	EmployeeService employeeService;
	/**
	 * *单个批量二合一
	 * 批量删除：1-2-3
	 * 单个删除：1
	 * @param id
	 * @return
	 */
	@ResponseBody
	@RequestMapping(value=("/emp/{ids}"),method=RequestMethod.DELETE)
	public Msg deleteEmpById(@PathVariable("ids")String ids){
		if(ids.contains("-")){
			employeeService.deleteBath(Utils.isIntegerIds(ids));
		}else{
			Integer id=Integer.parseInt(ids);
			employeeService.deleteEmp(id);
		}
		return Msg.success();
	}
	
	/**
	 * 根据员工id查询员工
	 * @param id
	 * @return
	 */
	@RequestMapping(value="/emp/{id}",method=RequestMethod.GET)
	@ResponseBody
	public Msg getEmp(@PathVariable("id") Integer id){
		
		Employee employee=employeeService.getEmp(id);
		return Msg.success().add("emp", employee);
		
		
	}
	/**
	 * 
	 * @param employee
	 * @return
	 */
	@ResponseBody
	@RequestMapping(value="/emp/{empId}",method=RequestMethod.PUT)
	public Msg updateEmp(Employee employee,HttpServletRequest request){
		System.out.println("请求体中的值："+request.getParameter("gender"));
		System.out.println("将要更新的员工数据："+employee);
		employeeService.updateEmp(employee);
		return Msg.success();
	}
	/**
	 * 判断用户名是否可用
	 * @param empName
	 * @return
	 */
	@RequestMapping("/checkuse")
	@ResponseBody
	public Msg checkuse(@RequestParam("empName")String empName){
		//先判断用户名是否是合法的表达式;
		if(!Utils.isUserName(empName)){
			return Msg.fail().add("va_msg", "用户名必须是6-16位数字和字母的组合或者2-5位中文");
		}
		//数据库用户名重复校验
		boolean b= employeeService.checkUser(empName);
		if(b){
			return Msg.success();
		}else{
			return Msg.fail().add("va_msg", "用户名不可用");
		}
		
	}
	
	/**
	 * 员工保存
	 * 
	 * 1、支持JSR303校验
	 * 2、导入Hibernate-Validator
	 * @param employee
	 * @return
	 */
	@RequestMapping(value="/emp",method=RequestMethod.POST)
	@ResponseBody
	public Msg saveEmp(@Valid Employee employee,BindingResult result){
		if(result.hasErrors()){
			//校验失败，应该返回失败，在模态框中显示校验失败的错误信息
			Map<String, Object> map =new HashMap<String, Object>();
			List<FieldError> errors=result.getFieldErrors();
			for(FieldError fieldError:errors){
				System.out.println("错误的字段名："+fieldError.getField());
				System.out.println("错误信息："+fieldError.getDefaultMessage());
				map.put(fieldError.getField(), fieldError.getDefaultMessage());
			}
		 
			return Msg.fail().add("errorFields", map);
		}else{
			employeeService.saveEmp(employee);
			return Msg.success();
		}
		
	}
	
	
	
	/**
	 * 查询员工分页数据
	 * @return
	 */
	//@RequestMapping("/emps")
	public String getEmps(@RequestParam(value="pn",defaultValue="1")Integer pn, Model model){
		//这不是一个分页查询
		//引入PageHelper分页插件
	   // 在查询之前只需要调用，传入页码，以及每页的大小
		PageHelper.startPage(pn, 5);
		// startPage后面紧跟的这个查询就是一个分页查询
		List<Employee> emps=employeeService.getAll();
		PageInfo page= new PageInfo(emps);
		// 使用pageInfo包装查询后的结果，只需要将pageInfo交给页面就行了。
	  // 封装了详细的分页信息,包括有我们查询出来的数据，传入连续显示的页数
		model.addAttribute("pageInfo",page);
		
		return "list";
				
	}
	/**
	 * 导入jackson包。
	 * @param pn
	 * @return
	 */
	@RequestMapping(value="/emps",method=RequestMethod.GET)
	@ResponseBody
	public Msg getEmpsJosn(@RequestParam(value="pn",defaultValue="1")Integer pn){
		// response.setHeader("Access-Control-Allow-Origin", "*"); 
		// 这不是一个分页查询
		// 引入PageHelper分页插件
		// 在查询之前只需要调用，传入页码，以及每页的大小
		PageHelper.startPage(pn, 5);
		// startPage后面紧跟的这个查询就是一个分页查询
		List<Employee> emps=employeeService.getAll();
		// 使用pageInfo包装查询后的结果，只需要将pageInfo交给页面就行了。
		// 封装了详细的分页信息,包括有我们查询出来的数据，传入连续显示的页数
		PageInfo page =new PageInfo(emps, 5);
		// return ResponseEntity.ok(Msg.success().add("pageInfo",page)); 
		// MappingJacksonValue mappingJacksonValue = new MappingJacksonValue(Msg.success().add("pageInfo",page));
		// mappingJacksonValue.setJsonpFunction("data");
		return   Msg.success().add("pageInfo",page);//mappingJacksonValue;
	}
	@RequestMapping(value="/ems",method=RequestMethod.GET)
	@ResponseBody
	 public JSONPObject  all(@RequestParam(value="callback",required=false) String callback){  
		    /*try {  
		    	List<Employee> result = employeeService.getAll();  
		        if(result!=null){  
		            return ResponseEntity.ok(result);  
		        }  
		        return ResponseEntity.status(HttpStatus.NOT_FOUND).body(null);  
		    } catch (Exception e) {  
		        // TODO Auto-generated catch block  
		        e.printStackTrace();  
		    }  
		    return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(null);  
		    }  */
		
		    return  null;
           }
	
	@RequestMapping(value = "/stest")
	@ResponseBody
	public  JSONPObject test(@RequestParam(value="callbackName") String callbackName) {
		
	   /* Map<String, String> map = new HashMap<String, String>();
	    map.put("aaa", "I'm Dreamlu！");*/
		PageHelper.startPage(1, 5);
		// startPage后面紧跟的这个查询就是一个分页查询
		List<Employee> emps=employeeService.getAll();
		// 使用pageInfo包装查询后的结果，只需要将pageInfo交给页面就行了。
		// 封装了详细的分页信息,包括有我们查询出来的数据，传入连续显示的页数
		PageInfo page =new PageInfo(emps, 5);
	    return new JSONPObject(callbackName, Msg.success().add("pageInfo",page)); //hellojsonp({"aaa":"I'm Dreamlu！"})
	}
}